package com.icefish.utils;

import com.icefish.bean.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.math.BigDecimal;
import java.util.Date;


public class JWT_Utile {
   // jwt的加密数据——盐
   public static final String SALT_KEY = "IceFish";


    /**
     * 创建令牌
     */

    public static String CreatToken(User user) {

        // 创建令牌
        JwtBuilder jwt = Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, SALT_KEY) // JWT头部,加密算法为HS256,盐是 瞎写的
                // 载荷部分 标准
                .setId(user.getUser_id().toString()) // jti: jwt的唯一身份标识，主要用来作为一次性token,从而回避重放攻击
                .setSubject(user.getUsername()) // sub: jwt所面向的用户
                .setIssuer("icefish") // iss: jwt签发者
                .setIssuedAt(new Date()) // iat: jwt的签发时间
                .setExpiration(new Date(System.currentTimeMillis() + (1000 * 60*60*24)))// exp: jwt的过期时间 24小时
                // 载荷部分 自定义
                .claim("across","true")
                .claim("user_id",user.getUser_id())
                .claim("username",user.getUsername());
        // 使用 compact 方法生成 Token
        String token = jwt.compact();
        // 返回 token
        return  token;
    }
    /**
     * 解析令牌
     */

    public static String AnalysisToken(String token){
        String msg = "验证成功";


        // 如果token超过有效期,那么解析会报错
        // setSigningKey("xxx") 把盐告知jwt , parseClaimsJws(token) 再把生成的token告知 就可以解密了
        Claims claims = Jwts.parser().setSigningKey(SALT_KEY).parseClaimsJws(token).getBody();
        //        // 输出解析后的token
//        System.out.println("jti :" + claims.getId()); // 唯一身份标识
//        System.out.println("sub :" + claims.getSubject()); // 用户名
//        System.out.println("iss :" + claims.getIssuer()); // 签发者
//        System.out.println("iat :" + claims.getIssuedAt().toLocaleString()); // 签发时间
//        System.out.println("exp :" + claims.getExpiration().toLocaleString()); // 过期时间
//        // 输出自定义部分载荷
//        System.out.println("across :" + claims.get("across"));
//        System.out.println("user_id :" + claims.get("user_id"));
//        System.out.println("username :" + claims.get("username"));

        // 用户未登录
        if (token == null || token.equals("")) {
            msg = "用户未登录";
        }else if (!claims.get("across").equals("true")){
            msg = "用户未登录";
        }

        // 令牌超时
        String now = new Date(System.currentTimeMillis())+"";
        BigDecimal now_NUM = new BigDecimal(now);
        BigDecimal jwt_exp_NUM = new BigDecimal(claims.getExpiration().toLocaleString());
        int isEXP = now_NUM.compareTo(jwt_exp_NUM);
        // isEXP： -1表示小于； 0 表示等于； 1表示大于
        if (isEXP == 1 ) {
            msg = "签名过期";
        }

        return msg;

    }

}
